home *** CD-ROM | disk | FTP | other *** search
/ Monster Media 1996 #15 / Monster Media Number 15 (Monster Media)(July 1996).ISO / prog_c / cuj0696.zip / DWYER.ZIP / MAXOFT.TST / MAXOFTKS.C < prev    next >
C/C++ Source or Header  |  1996-03-26  |  2KB  |  74 lines

  1. /* ============ */
  2. /* maxoftks.c    */
  3. /* ============ */
  4. #include <defcodes.h>
  5. #include <maxtdefs.h>
  6. #include <miscdefs.h>
  7. #include <mconf.h>
  8.  
  9. #define    MAX_SAMPS    ((unsigned)RAND_MAX+1U)
  10. int WorkArea[MAX_SAMPS];
  11.  
  12. static  int  IntCmprFun(const void *Key, const void *Elem)
  13. {
  14.     return (*(int *) Key - *(int *) Elem);
  15. }
  16.  
  17. /* ==================================================================== */
  18. /* ApplyKStoMaxOfT - Applies Kolmogorov-Smirnov test to Maximum of t    */
  19. /* ==================================================================== */
  20. void
  21. ApplyKStoMaxOfT(MAXT_DATA_STRU * MaxtData)
  22. {
  23.     UINT    k;
  24.     double  MaxKnNeg, MaxKnPos;
  25.  
  26.     for (k = 0; k < MaxtData->NumSequences; ++k)
  27.     {
  28.     int    j;
  29.     int    Largest;
  30.  
  31.     Largest = -1;
  32.     for (j = 0; j < MaxtData->SequenceLen; ++j)
  33.     {
  34.         int     NextVariate = MaxtData->RandFun();
  35.  
  36.         Largest = __max(Largest, NextVariate);
  37.     }
  38.  
  39.     WorkArea[k] = Largest;
  40.     }
  41.  
  42.     MaxtData->TotNumGen +=
  43.     MaxtData->SequenceLen * MaxtData->NumSequences;
  44.  
  45.     qsort((void *)WorkArea, MaxtData->NumSequences, sizeof(int), IntCmprFun);
  46.  
  47.     MaxKnNeg = MaxKnPos = -100000;
  48.     for (k = 1; k <= MaxtData->NumSequences; ++k)
  49.     {
  50.     double    KSVal, NextKn;
  51.  
  52.     KSVal = powi((double)WorkArea[k-1]/(double)MAX_SAMPS,
  53.             MaxtData->SequenceLen);
  54.  
  55.     NextKn = (double)k/(double)MaxtData->NumSequences - KSVal;
  56.     MaxKnPos = __max(MaxKnPos, NextKn);
  57.  
  58.     NextKn = 1.0/(double)MaxtData->NumSequences - NextKn;
  59.     MaxKnNeg = __max(MaxKnNeg, NextKn);
  60.     }
  61.     MaxtData->KSPos = MaxKnPos;
  62.     MaxtData->KSNeg = MaxKnNeg;
  63.     MaxtData->ProbKSPos = KSmirnov(MaxtData->NumSequences, MaxKnPos);
  64.     MaxtData->ProbKSNeg = KSmirnov(MaxtData->NumSequences, MaxKnNeg);
  65.  
  66.     /* ------------------------------------------------------------ */
  67.     /* These printouts should be compared to Tables in Knuth, Vol 2 */
  68.     /* ------------------------------------------------------------ */
  69.     P(printf("MaxKn+ = %.8f, P(MaxKn+) = %.8f%%\n",
  70.     sqrt(MaxtData->NumSequences)*MaxKnPos, 100*MaxtData->ProbKSPos));
  71.     P(printf("MaxKn- = %.8f, P(MaxKn-) = %.8f%%\n",
  72.     sqrt(MaxtData->NumSequences)*MaxKnNeg, 100*MaxtData->ProbKSNeg));
  73. }
  74.